/*
 * Author: 李波(Edwin Lee)
 * Date: 2024-08-07 01:35:55
 * FilePath: /mprpc/src/include/rpcprovider.h
 * LastEditTime: 2024-08-31 14:08:53
 * version: 1.0
 * Description: 框架提供的专门服务发布rpc服务的网络对象类
 */
#ifndef __RPCPROVIDER_H__
#define __RPCPROVIDER_H__

#include "google/protobuf/service.h"
#include <google/protobuf/descriptor.h>
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <string>
#include <memory>
#include <cstdlib>
#include <functional>
#include <unordered_map>


class RpcProvider
{
public:
    // 这里是框架提供给外部使用的，可以发布rpc方法的接口函数(注册方法)
    void NotifyService(google::protobuf::Service* service);

    // 启动rpc服务节点，开始提供rpc远程过程调用服务
    void Run();

private:
    // 新的socket连接回调函数
    void onConnection(const muduo::net::TcpConnectionPtr&);
    // 已建立连接用户的读写事件
    void onMessage(const muduo::net::TcpConnectionPtr&, muduo::net::Buffer*, muduo::Timestamp);
    // Closure的回调操作，用于序列化rpc的相应和网络发送
    void SendRpcResponse(const muduo::net::TcpConnectionPtr&,google::protobuf::Message*);


    muduo::net::EventLoop eventloop_;

    // service服务类型信息
    struct ServiceInfo
    {
        google::protobuf::Service* service_;    //保存服务对象
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor*> methodMap_;  //保存服务方法
    };

    // 保存注册成功的服务对象和其服务方法的所有信息,第一个元素为服务名称，第二个为服务信息
    std::unordered_map<std::string, ServiceInfo>  serviceMap_;
};
#endif
